/**
 * @description 所有人可使用的参数配置列表
 * @params hideMenu: 是否隐藏当前路由结点不在导航中展示
 * @params alwayShow: 只有一个子路由时是否总是展示菜单，默认false
 */
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
import store from '@/store'
import i18n from '@/locale'
import NProgress from '@/utils/system/nprogress'
import { changeTitle } from '@/utils/system/title'
NProgress.configure({ showSpinner: false })
// 动态路由相关引入数据
import Layout from '@/layout/index.vue'
import MenuBox from '@/components/menu/index.vue'
import { createNameComponent } from './createNode'
// 引入modules
import Dashboard from './modules/dashboard'
import Document from './modules/document'
import Pages from './modules/pages'
import Menu from './modules/menu'
import Component from './modules/component'
import Directive from './modules/directive'
import SystemManage from './modules/systemManage'
import Chart from './modules/chart'
import Print from './modules/print'
import Community from './modules/community'
// ====yuange添加的代码=======
import yDY from './modules/yDY'
//系统必须用的路由
import System from './modules/system'
//初始化必须要的路由先放进去
let modules: object[] = [
  ...System
]
const { t } = i18n.global
//any 允许被赋值为任何类型
const routes: any = modules
const router = createRouter({
  history: createWebHashHistory(),//等同于vue2 中的mode：history
  routes//路由数组信息，可以通过useRouter().options.routes;
})
// const router = createRouter({
//   history: routerHistory,
//   routes: [
//     {
//       path: '/',
//       component: Home
//     },
//     {
//       path: '/contact',
//       component: Contact
//     }
//   ]
// })
// 登录后动态加入的路由，登陆后再一个一个放进去
//一个父级主菜单是单独一个路由文件
let asyncRoutes: RouteRecordRaw[] = [
  ...Dashboard,//首页
  // ...Document,//文档 
  // ...Component,//组件
  // ...Pages,//页面
  // ...Menu,//多级嵌套菜单
  // ...Directive,//自定义指令
  // ...Chart,//图标菜单
  // ...SystemManage,//系统管理
  // ...Print,//打印
  // ...Community,//社区的力量
  ...yDY,
]
// 动态路由的权限新增，供登录后调用
export async function addRoutes() {
  // let data = [ // 来源于后端的数据
  //   {
  //     path: '/echarts',
  //     meta: { title: '权限管理', icon: 'el-icon-pie-chart' },
  //     children: [
  //       {
  //         meta: { title: '菜单管理' },
  //         component: 'index',
  //         path: 'box456789'
  //       },
  //       {
  //         meta: { title: '角色管理' },
  //         component: 'index',
  //         path: 'box1'
  //       },
  //       {
  //         meta: { title: '用户管理' },
  //         component: 'index',
  //         path: 'box1456'
  //       },
  //     ]
  //   },
  // ]
  // eachData(data, 0) // 匹配本地路由，产生一棵新树
  // data.forEach(item => { // 添加到路由表里面去
  //   modules.push(item)
  //   router.addRoute(item)
  // })
  // 与后端交互的逻辑处理，处理完后异步添加至页面
  asyncRoutes.forEach(item => {
    //放到一个数组里面，这个数组保存了所有的菜单
    modules.push(item)
    //放到router对象里面，
    //动态添加路由，单个添加
    router.addRoute(item)
  })
}

//重置匹配所有路由的解决方案，todo
function eachData(data: any, type: number) {
  data.forEach(d => {
    if (d.children && d.children.length > 0) {
      if (type === 0) {
        d.component = Layout
      } else {
        d.component = createNameComponent(MenuBox)
      }
      eachData(d.children, type + 1)
    } else {
      /* 组件匹配暂时写死，todo项 */
      // d.component = createNameComponent(() => import('@/views/main/pages/crudTable/index.vue'))
      d.component = x.component
    }
  })
  console.log(data)
}

// 如果你登录了，那么系统才会把路由加入到路由表里面，防止越权访问
if (store.state.user.token) {
  // 登录之后动态加载路由，和左边的菜单
  addRoutes()
}

//白名单，如果白名单里面有的话，那么路由不会拦截。
const whiteList = ['/login']
router.beforeEach((to, _from, next) => {
  // 显示进度条
  NProgress.start();
  // 每次路由跳转都要检查一下是不是登录了，或者路由白名单里面有没有这个路由
  if (store.state.user.token || whiteList.indexOf(to.path) !== -1) {
    to.meta.title ? (changeTitle(to.meta.title)) : ""; // 动态title
    next()
  } else {
    //跳转到登录页
    next("/login"); // 全部重定向到登录页
    to.meta.title ? (changeTitle(to.meta.title)) : ""; // 动态title
  }
});

router.afterEach((to, _from) => {
  const keepAliveComponentsName = store.getters['keepAlive/keepAliveComponentsName'] || []
  const name = to.matched[to.matched.length - 1].components.default.name
  if (to.meta && to.meta.cache && name && !keepAliveComponentsName.includes(name)) {
    store.commit('keepAlive/addKeepAliveComponentsName', name)
  }
  // 结束进度条
  NProgress.done();
});

export {
  modules
}

export default router
